include:
  - local: .gitlab/ci/rails/shared.gitlab-ci.yml

###############################################################
# EE/FOSS: default refs (MRs, default branch, schedules) jobs #
setup-test-env:
  extends:
    - .rails-job-base
    - .setup-test-env-cache
    - .rails:rules:setup-test-env
  stage: prepare
  needs: []
  variables:
    SETUP_DB: "false"
  script:
    - echo $CI_MERGE_REQUEST_APPROVED
    - source scripts/gitlab_component_helpers.sh
    - run_timed_command "download_and_extract_gitlab_workhorse_package" || true
    - section_start "setup-test-env" "Setting up testing environment"; scripts/setup-test-env; section_end "setup-test-env";
    - select_gitlab_workhorse_essentials
    - section_start "gitaly-test-build" "Compiling Gitaly binaries"; scripts/gitaly-test-build; section_end "gitaly-test-build";  # Do not use 'bundle exec' here
  artifacts:
    expire_in: 7d
    paths:
      - ${TMP_TEST_FOLDER}/gitaly/_build/bin/
      - ${TMP_TEST_FOLDER}/gitaly/config.toml
      - ${TMP_TEST_FOLDER}/gitaly/gitaly2.config.toml
      - ${TMP_TEST_FOLDER}/gitaly/internal/
      - ${TMP_TEST_FOLDER}/gitaly/Makefile
      - ${TMP_TEST_FOLDER}/gitaly/praefect.config.toml
      - ${TMP_TEST_FOLDER}/gitaly/praefect-db.config.toml
      - ${TMP_TEST_FOLDER}/gitlab-elasticsearch-indexer/bin/gitlab-elasticsearch-indexer
      - ${TMP_TEST_FOLDER}/gitlab-shell/
      - ${TMP_TEST_FOLDER}/gitlab-test-fork/
      - ${TMP_TEST_FOLDER}/gitlab-test-fork.bundle
      - ${TMP_TEST_FOLDER}/gitlab-test/
      - ${TMP_TEST_FOLDER}/gitlab-test.bundle
      - ${TMP_TEST_FOLDER}/repositories/
      - ${TMP_TEST_FOLDER}/second_storage/
      - ${TMP_TEST_GITLAB_WORKHORSE_PATH}/
    when: always

update-setup-test-env-cache:
  extends:
    - setup-test-env
    - .setup-test-env-cache-push
    - .shared:rules:update-cache
  artifacts:
    paths: []  # This job's purpose is only to update the cache.

update-gitaly-binaries-cache:
  extends:
    - setup-test-env
    - .gitaly-binaries-cache-push
    - .shared:rules:update-gitaly-binaries-cache
  artifacts:
    paths: []  # This job's purpose is only to update the cache.

update-ruby-gems-coverage-cache-push:
  extends:
    - .ruby-gems-coverage-cache-push
    - .shared:rules:update-cache
  variables:
    BUNDLE_WITHOUT: "" # This is to override the variable defined in .gitlab-ci.yml
    BUNDLE_ONLY: "coverage"
  script:
    - source scripts/utils.sh
    - bundle_install_script

# Used in:
#   - rspec:coverage
#   - rspec:undercoverage
.coverage-base:
  extends:
    - .default-retry
    - .ruby-gems-coverage-cache
  variables:
    BUNDLE_WITHOUT: "" # This is to override the variable defined in .gitlab-ci.yml
    BUNDLE_ONLY: "coverage"
  before_script:
    - source scripts/utils.sh
    - bundle_install_script

rspec migration pg14:
  extends:
    - .rspec-base-pg14
    - .rspec-base-migration
    - .rails:rules:ee-and-foss-migration
    - .rspec-migration-parallel

rspec background_migration pg14:
  extends:
    - .rspec-base-pg14
    - .rspec-base-migration
    - .rails:rules:ee-and-foss-background-migration
    - .rspec-background-migration-parallel

rspec migration pg14 single-db:
  extends:
    - rspec migration pg14
    - .single-db-rspec
    - .rails:rules:single-db

rspec background_migration pg14 single-db:
  extends:
    - rspec background_migration pg14
    - .single-db-rspec
    - .rails:rules:single-db

rspec migration pg14 single-db-ci-connection:
  extends:
    - rspec migration pg14
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection

rspec background_migration pg14 single-db-ci-connection:
  extends:
    - rspec background_migration pg14
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection

rspec migration pg14 praefect:
  extends:
    - rspec migration pg14
    - .praefect-with-db
    - .rails:rules:praefect-with-db

rspec background_migration pg14 praefect:
  extends:
    - rspec background_migration pg14
    - .praefect-with-db
    - .rails:rules:praefect-with-db

rspec migration pg14 clusterwide-db:
  extends:
    - rspec migration pg14
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec background_migration pg14 clusterwide-db:
  extends:
    - rspec background_migration pg14
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec unit pg14:
  extends:
    - .rspec-base-pg14
    - .rails:rules:ee-and-foss-unit
    - .rspec-unit-parallel

rspec unit pg14 single-redis:
  extends:
    - rspec unit pg14
    - .no-redis-cluster
    - .rails:rules:single-redis

rspec unit pg14 single-db:
  extends:
    - rspec unit pg14
    - .single-db-rspec
    - .rails:rules:single-db

rspec unit pg14 single-db-ci-connection:
  extends:
    - rspec unit pg14
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection

rspec unit pg14 clusterwide-db:
  extends:
    - rspec unit pg14
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec unit pg14 praefect:
  extends:
    - rspec unit pg14
    - .praefect-with-db
    - .rails:rules:praefect-with-db

rspec integration pg14:
  extends:
    - .rspec-base-pg14
    - .rails:rules:ee-and-foss-integration
    - .rspec-integration-parallel

rspec integration pg14 single-redis:
  extends:
    - rspec integration pg14
    - .no-redis-cluster
    - .rails:rules:single-redis

rspec integration pg14 single-db:
  extends:
    - rspec integration pg14
    - .single-db-rspec
    - .rails:rules:single-db

rspec integration pg14 single-db-ci-connection:
  extends:
    - rspec integration pg14
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection

rspec integration pg14 clusterwide-db:
  extends:
    - rspec integration pg14
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec integration pg14 praefect:
  extends:
    - rspec integration pg14
    - .praefect-with-db
    - .rails:rules:praefect-with-db

rspec system pg14:
  extends:
    - .rspec-base-pg14
    - .rails:rules:ee-and-foss-system
    - .rspec-system-parallel
  variables:
    DEBUG_GITLAB_TRANSACTION_STACK: "true"

rspec system pg14 single-redis:
  extends:
    - rspec system pg14
    - .no-redis-cluster
    - .rails:rules:single-redis

rspec system pg14 single-db:
  extends:
    - rspec system pg14
    - .single-db-rspec
    - .rails:rules:single-db

rspec system pg14 single-db-ci-connection:
  extends:
    - rspec system pg14
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection

rspec system pg14 clusterwide-db:
  extends:
    - rspec system pg14
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec system pg14 praefect:
  extends:
    - rspec system pg14
    - .praefect-with-db
    - .rails:rules:praefect-with-db

# Dedicated job to test DB library code against PG12.
# Note that these are already tested against PG12 in the `rspec unit pg12` / `rspec-ee unit pg12` jobs.
rspec db-library-code pg12:
  extends:
    - .rspec-base-pg12
    - .rails:rules:ee-and-foss-db-library-code
  script:
    - !reference [.base-script, script]
    - rspec_db_library_code

# Dedicated job to test DB library code against PG13.
# Note that these are already tested against PG13 in the `rspec unit pg13` / `rspec-ee unit pg13` jobs.
rspec db-library-code pg13:
  extends:
    - .rspec-base-pg13
    - .rails:rules:ee-and-foss-db-library-code
  script:
    - !reference [.base-script, script]
    - rspec_db_library_code

rspec fast_spec_helper:
  extends:
    - .rspec-base-pg14
    - .rails:rules:ee-and-foss-fast_spec_helper
  script:
    - fast_spec_helper_specs=$(git grep -l -E '^require.*fast_spec_helper')
    # Load fast_spec_helper as well just in case there are no specs available.
    - bin/rspec --dry-run spec/fast_spec_helper.rb $fast_spec_helper_specs

rspec unit clickhouse:
  extends:
    - .rspec-base-pg14-clickhouse23
    - .rails:rules:clickhouse-changes

rspec-ee unit clickhouse:
  extends:
    - .rspec-base-pg14-clickhouse23
    - .rails:rules:clickhouse-changes

gitlab:setup:
  extends: .db-job-base
  variables:
    SETUP_DB: "false"
  script:
    # Manually clone gitlab-test and only seed this project in
    # db/fixtures/development/04_project.rb thanks to SIZE=1 below
    - git clone https://gitlab.com/gitlab-org/gitlab-test.git
       /home/git/repositories/gitlab-org/gitlab-test.git
    - !reference [.base-script, script]
    - force=yes SIZE=1 FIXTURE_PATH="db/fixtures/development" bundle exec rake gitlab:setup
  artifacts:
    when: on_failure
    expire_in: 1d
    paths:
      - log/*.log

rspec:deprecations:
  extends:
    - .default-retry
    - .default-before_script
    - .static-analysis-cache
    - .rails:rules:deprecations
  stage: post-test
  allow_failure: true
  needs:
    - job: rspec:artifact-collector unit
      optional: true
    - job: rspec:artifact-collector system
      optional: true
    - job: rspec:artifact-collector remainder
      optional: true
    - job: rspec:artifact-collector ee
      optional: true
  variables:
    SETUP_DB: "false"
  script:
    - grep -h -R "keyword" deprecations/ | awk '{$1=$1};1' | sort | uniq -c | sort
    - grep -R "keyword" deprecations/ | wc
    - run_timed_command "fail_on_warnings bundle exec rubocop --only Lint/LastKeywordArgument --parallel"
  artifacts:
    expire_in: 31d
    when: always
    paths:
      - deprecations/

# The jobs built upon `.artifact-collector` are to work around the
# needs: [] limit of a maximum of 50 dependencies.
# These intermediate jobs allow us to collect the artifacts of
# more than 50 jobs and still use `needs:` to ensure a timely execution
.artifact-collector:
  stage: post-test
  variables:
    GIT_STRATEGY: none
  image: alpine:3.17
  script:
    - mkdir -p coverage deprecations rspec auto_explain
    - ls coverage/ deprecations/ rspec/ auto_explain/
  artifacts:
    expire_in: 7d
    when: always
    paths:
      - coverage/
      - deprecations/
      - rspec/
      - auto_explain/

rspec:artifact-collector unit:
  extends:
    - .artifact-collector
    - .rails:rules:ee-and-foss-unit
  needs:
    - rspec unit pg14 # 28 jobs
    - job: rspec unit clickhouse # 1 job
      optional: true

rspec:artifact-collector system:
  extends:
    - .artifact-collector
    - .rails:rules:ee-and-foss-system
  needs:
    - rspec system pg14 # 28 jobs

rspec:artifact-collector remainder:
  extends:
    - .artifact-collector
  needs:
    - job: rspec integration pg14 # 12 jobs
      optional: true
    - job: rspec migration pg14 # 8 jobs
      optional: true
    - job: rspec background_migration pg14 # 4 jobs
      optional: true
  rules:
    - !reference ['.rails:rules:ee-and-foss-integration', rules]
    - !reference ['.rails:rules:ee-and-foss-migration', rules]
    - !reference ['.rails:rules:ee-and-foss-background-migration', rules]

rspec:artifact-collector as-if-foss unit:
  extends:
    - .artifact-collector
    - .rails:rules:as-if-foss-unit
  needs:
    - rspec unit pg14-as-if-foss # 28 jobs

rspec:artifact-collector as-if-foss system:
  extends:
    - .artifact-collector
    - .rails:rules:as-if-foss-system
  needs:
    - rspec system pg14-as-if-foss  # 28 jobs

rspec:artifact-collector as-if-foss remainder:
  extends:
    - .artifact-collector
  needs:
    - job: rspec integration pg14-as-if-foss # 12 jobs
      optional: true
    - job: rspec migration pg14-as-if-foss # 8 jobs
      optional: true
    - job: rspec background_migration pg14-as-if-foss # 4 jobs
      optional: true
  rules:
    - !reference ['.rails:rules:as-if-foss-integration', rules]
    - !reference ['.rails:rules:as-if-foss-migration', rules]
    - !reference ['.rails:rules:as-if-foss-background-migration', rules]

rspec:artifact-collector single-redis:
  extends:
    - .artifact-collector
    - .rails:rules:single-redis
  needs:
    - rspec unit pg14 single-redis # 28 jobs
    - rspec integration pg14 single-redis # 12 jobs

rspec:artifact-collector system single-redis:
  extends:
    - .artifact-collector
    - .rails:rules:single-redis
  needs:
    - rspec system pg14 single-redis # 28 jobs

rspec:artifact-collector ee single-redis:
  extends:
    - .artifact-collector
    - .rails:rules:single-redis
  needs:
    - job: rspec-ee unit pg14 single-redis # 18 jobs
      optional: true
    - job: rspec-ee integration pg14 single-redis # 6 jobs
      optional: true
    - job: rspec-ee system pg14 single-redis # 10 jobs
      optional: true

rspec:artifact-collector ee:
  extends:
    - .artifact-collector
  needs:
    - job: rspec-ee migration pg14 # 2 jobs
      optional: true
    - job: rspec-ee background_migration pg14 # 2 jobs
      optional: true
    - job: rspec-ee unit pg14 # 18 jobs
      optional: true
    - job: rspec-ee unit clickhouse # 1 job
      optional: true
    - job: rspec-ee integration pg14 # 6 jobs
      optional: true
    - job: rspec-ee system pg14 # 10 jobs
      optional: true
  rules:
    - !reference ['.rails:rules:ee-only-migration', rules]
    - !reference ['.rails:rules:ee-only-background-migration', rules]
    - !reference ['.rails:rules:ee-only-unit', rules]
    - !reference ['.rails:rules:ee-only-integration', rules]
    - !reference ['.rails:rules:ee-only-system', rules]

rspec:coverage:
  image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-bullseye-slim-ruby-${RUBY_VERSION}
  extends:
    - .coverage-base
    - .rails:rules:rspec-coverage
  stage: post-test
  needs:
    - job: setup-test-env
      artifacts: false
    # FOSS/EE jobs
    - job: rspec:artifact-collector unit
      optional: true
    - job: rspec:artifact-collector system
      optional: true
    - job: rspec:artifact-collector remainder
      optional: true
    - job: rspec:artifact-collector single-redis
      optional: true
    - job: rspec:artifact-collector system single-redis
      optional: true
    # as-if-foss jobs
    - job: rspec:artifact-collector as-if-foss unit
      optional: true
    - job: rspec:artifact-collector as-if-foss system
      optional: true
    - job: rspec:artifact-collector as-if-foss remainder
      optional: true
    # EE jobs
    - job: rspec:artifact-collector ee single-redis
      optional: true
    - job: rspec:artifact-collector ee
      optional: true
    # Memory jobs
    - job: memory-on-boot
      optional: true
      artifacts: false
  script:
    - run_timed_command "bundle exec scripts/merge-simplecov"
  coverage: '/LOC \((\d+\.\d+%)\) covered.$/'
  artifacts:
    name: coverage
    expire_in: 31d
    paths:
      - coverage/index.html
      - coverage/assets/
      - coverage/lcov/
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage/coverage.xml

rspec:undercoverage:
  image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-bullseye-slim-ruby-${RUBY_VERSION}
  extends:
    - .coverage-base
    - .rails:rules:rspec-undercoverage
  stage: post-test
  needs: ["rspec:coverage"]
  script:
    - if [ -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" ]; then
        echo "HEAD is $(git rev-parse HEAD). \$CI_MERGE_REQUEST_TARGET_BRANCH_SHA is ${CI_MERGE_REQUEST_TARGET_BRANCH_SHA}";
      else
        echo "HEAD is $(git rev-parse HEAD). \$CI_MERGE_REQUEST_DIFF_BASE_SHA is ${CI_MERGE_REQUEST_DIFF_BASE_SHA}";
      fi;
    - UNDERCOVERAGE_COMPARE="${CI_MERGE_REQUEST_TARGET_BRANCH_SHA:-$CI_MERGE_REQUEST_DIFF_BASE_SHA}"
    - git diff ${UNDERCOVERAGE_COMPARE} --stat
    - echo "Undercoverage comparing with ${UNDERCOVERAGE_COMPARE}."
    - if [ -f scripts/undercoverage ]; then
        run_timed_command "bundle exec scripts/undercoverage ${UNDERCOVERAGE_COMPARE}";
      fi;

rspec:feature-flags:
  extends:
    - .rails:rules:rspec-feature-flags
  stage: post-test
  needs:
    - job: "feature-flags-usage"
    - job: "haml-lint"
    - job: "haml-lint ee"
      optional: true
  before_script:
    - source scripts/utils.sh
  script:
    - if [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then
        run_timed_command "scripts/used-feature-flags" || (scripts/slack master-broken "☠️ \`${CI_JOB_NAME}\` failed! ☠️ See ${CI_JOB_URL}" ci_failing "GitLab Bot" && exit 1);
      else
        run_timed_command "scripts/used-feature-flags";
      fi

rspec:flaky-tests-report:
  extends:
    - .default-retry
    - .rails:rules:flaky-tests-report
  stage: post-test
  needs: !reference ["rspec:coverage", "needs"]
  before_script:
    - source scripts/utils.sh
    - source scripts/rspec_helpers.sh
  script:
    - generate_flaky_tests_reports
  artifacts:
    expire_in: 31d
    paths:
      - rspec/

rspec:merge-auto-explain-logs:
  extends:
    - .rails:rules:rspec-merge-auto-explain-logs
  stage: post-test
  needs: !reference ["rspec:coverage", "needs"]
  before_script:
    - source scripts/utils.sh
    - source scripts/rspec_helpers.sh
  script:
    - merge_auto_explain_logs
  artifacts:
    name: auto-explain-logs
    expire_in: 31d
    paths:
      - auto_explain/

# EE/FOSS: default refs (MRs, default branch, schedules) jobs #
#######################################################

##################################################
# EE: default refs (MRs, default branch, schedules) jobs #
rspec-predictive:pipeline-generate:
  extends:
    - .rails:rules:rspec-predictive
  stage: prepare
  needs: ["detect-tests", "retrieve-tests-metadata"]
  script:
    - scripts/generate_rspec_pipeline.rb -t "${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}" -k "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}" -f "${RSPEC_MATCHING_TESTS_FOSS_PATH}" -o "${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}.yml"
    - scripts/generate_rspec_pipeline.rb -t "${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}" -k "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}" -f "${RSPEC_MATCHING_TESTS_EE_PATH}" -o "${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}-ee.yml" -p "ee/"
    - echo "Content of ${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}.yml:"
    - cat "${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}.yml"
    - echo "\n================================================\n"
    - echo "Content of ${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}-ee.yml:"
    - cat "${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}-ee.yml"
  artifacts:
    expire_in: 1 day
    paths:
      - "${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}.yml"
      - "${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}-ee.yml"

rspec:predictive:trigger:
  extends:
    - .rails:rules:rspec-predictive
  stage: test
  needs:
    - job: "setup-test-env"
      artifacts: false
    - job: "retrieve-tests-metadata"
      artifacts: false
    - job: "compile-test-assets"
      artifacts: false
    - job: "rspec-predictive:pipeline-generate"
      artifacts: true
  variables:
    PARENT_PIPELINE_ID: $CI_PIPELINE_ID
  trigger:
    strategy: depend
    forward:
      yaml_variables: true
      pipeline_variables: true
    include:
      - artifact: "${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}.yml"
        job: rspec-predictive:pipeline-generate

rspec-ee:predictive:trigger:
  extends: rspec:predictive:trigger
  trigger:
    include:
      - artifact: "${RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML}-ee.yml"
        job: rspec-predictive:pipeline-generate

rspec migration pg14-as-if-foss:
  extends:
    - .rspec-base-pg14-as-if-foss
    - .rspec-base-migration
    - .rails:rules:as-if-foss-migration
    - .rspec-migration-parallel

rspec background_migration pg14-as-if-foss:
  extends:
    - .rspec-base-pg14-as-if-foss
    - .rspec-base-migration
    - .rails:rules:as-if-foss-background-migration
    - .rspec-background-migration-parallel

rspec migration pg14-as-if-foss single-db:
  extends:
    - rspec migration pg14-as-if-foss
    - .single-db-rspec
    - .rails:rules:single-db-as-if-foss

rspec background_migration pg14-as-if-foss single-db:
  extends:
    - rspec background_migration pg14-as-if-foss
    - .single-db-rspec
    - .rails:rules:single-db-as-if-foss

rspec migration pg14-as-if-foss single-db-ci-connection:
  extends:
    - rspec migration pg14-as-if-foss
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection-as-if-foss

rspec background_migration pg14-as-if-foss single-db-ci-connection:
  extends:
    - rspec background_migration pg14-as-if-foss
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection-as-if-foss

rspec migration pg14-as-if-foss clusterwide-db:
  extends:
    - rspec migration pg14-as-if-foss
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec background_migration pg14-as-if-foss clusterwide-db:
  extends:
    - rspec background_migration pg14-as-if-foss
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec unit pg14-as-if-foss:
  extends:
    - .rspec-base-pg14-as-if-foss
    - .rails:rules:as-if-foss-unit
    - .rspec-unit-parallel

rspec unit pg14-as-if-foss single-db:
  extends:
    - rspec unit pg14-as-if-foss
    - .single-db-rspec
    - .rails:rules:single-db-as-if-foss

rspec unit pg14-as-if-foss single-db-ci-connection:
  extends:
    - rspec unit pg14-as-if-foss
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection-as-if-foss

rspec unit pg14-as-if-foss clusterwide-db:
  extends:
    - rspec unit pg14-as-if-foss
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec integration pg14-as-if-foss:
  extends:
    - .rspec-base-pg14-as-if-foss
    - .rails:rules:as-if-foss-integration
    - .rspec-integration-parallel

rspec integration pg14-as-if-foss single-db:
  extends:
    - rspec integration pg14-as-if-foss
    - .single-db-rspec
    - .rails:rules:single-db-as-if-foss

rspec integration pg14-as-if-foss single-db-ci-connection:
  extends:
    - rspec integration pg14-as-if-foss
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection-as-if-foss

rspec integration pg14-as-if-foss clusterwide-db:
  extends:
    - rspec integration pg14-as-if-foss
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec system pg14-as-if-foss:
  extends:
    - .rspec-base-pg14-as-if-foss
    - .rails:rules:as-if-foss-system
    - .rspec-system-parallel

rspec system pg14-as-if-foss single-db:
  extends:
    - rspec system pg14-as-if-foss
    - .single-db-rspec
    - .rails:rules:single-db-as-if-foss

rspec system pg14-as-if-foss single-db-ci-connection:
  extends:
    - rspec system pg14-as-if-foss
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection-as-if-foss

rspec system pg14-as-if-foss clusterwide-db:
  extends:
    - rspec system pg14-as-if-foss
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec-ee migration pg14:
  extends:
    - .rspec-ee-base-pg14
    - .rspec-base-migration
    - .rails:rules:ee-only-migration
    - .rspec-ee-migration-parallel

rspec-ee background_migration pg14:
  extends:
    - .rspec-ee-base-pg14
    - .rspec-base-migration
    - .rails:rules:ee-only-background-migration
    - .rspec-ee-background-migration-parallel

rspec-ee migration pg14 single-db:
  extends:
    - rspec-ee migration pg14
    - .single-db-rspec
    - .rails:rules:single-db

rspec-ee background_migration pg14 single-db:
  extends:
    - rspec-ee background_migration pg14
    - .single-db-rspec
    - .rails:rules:single-db

rspec-ee migration pg14 single-db-ci-connection:
  extends:
    - rspec-ee migration pg14
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection

rspec-ee background_migration pg14 single-db-ci-connection:
  extends:
    - rspec-ee background_migration pg14
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection

rspec-ee migration pg14 clusterwide-db:
  extends:
    - rspec-ee migration pg14
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec-ee background_migration pg14 clusterwide-db:
  extends:
    - rspec-ee background_migration pg14
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec-ee migration pg14 praefect:
  extends:
    - rspec migration pg14
    - .praefect-with-db
    - .rails:rules:praefect-with-db

rspec-ee background_migration pg14 praefect:
  extends:
    - rspec background_migration pg14
    - .praefect-with-db
    - .rails:rules:praefect-with-db

rspec-ee unit pg14:
  extends:
    - .rspec-ee-base-pg14
    - .rails:rules:ee-only-unit
    - .rspec-ee-unit-parallel

rspec-ee unit pg14 es8:
  extends:
    - .rspec-ee-base-pg14-es8
    - .rspec-ee-unit-parallel

rspec-ee unit pg14 single-db:
  extends:
    - rspec-ee unit pg14
    - .single-db-rspec
    - .rails:rules:single-db

rspec-ee unit pg14 single-redis:
  extends:
    - rspec-ee unit pg14
    - .no-redis-cluster
    - .rails:rules:single-redis

rspec-ee unit pg14 single-db-ci-connection:
  extends:
    - rspec-ee unit pg14
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection

rspec-ee unit pg14 clusterwide-db:
  extends:
    - rspec-ee unit pg14
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec-ee integration pg14:
  extends:
    - .rspec-ee-base-pg14
    - .rails:rules:ee-only-integration
    - .rspec-ee-integration-parallel

rspec-ee integration pg14 es8:
  extends:
    - .rspec-ee-base-pg14-es8
    - .rspec-ee-integration-parallel

rspec-ee integration pg14 single-db:
  extends:
    - rspec-ee integration pg14
    - .single-db-rspec
    - .rails:rules:single-db

rspec-ee integration pg14 single-redis:
  extends:
    - rspec-ee integration pg14
    - .no-redis-cluster
    - .rails:rules:single-redis

rspec-ee integration pg14 single-db-ci-connection:
  extends:
    - rspec-ee integration pg14
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection

rspec-ee integration pg14 clusterwide-db:
  extends:
    - rspec-ee integration pg14
    - .clusterwide-db
    - .rails:rules:clusterwide-db

rspec-ee system pg14:
  extends:
    - .rspec-ee-base-pg14
    - .rails:rules:ee-only-system
    - .rspec-ee-system-parallel

rspec-ee system pg14 es8:
  extends:
    - .rspec-ee-base-pg14-es8
    - .rspec-ee-system-parallel

rspec-ee system pg14 single-db:
  extends:
    - rspec-ee system pg14
    - .single-db-rspec
    - .rails:rules:single-db

rspec-ee system pg14 single-redis:
  extends:
    - rspec-ee system pg14
    - .no-redis-cluster
    - .rails:rules:single-redis

rspec-ee system pg14 single-db-ci-connection:
  extends:
    - rspec-ee system pg14
    - .single-db-ci-connection-rspec
    - .rails:rules:single-db-ci-connection

rspec-ee system pg14 clusterwide-db:
  extends:
    - rspec-ee system pg14
    - .clusterwide-db
    - .rails:rules:clusterwide-db
# EE: default refs (MRs, default branch, schedules) jobs #
##################################################

##########################################
# EE/FOSS: default branch nightly scheduled jobs #

# PG12
rspec migration pg12:
  extends:
    - .rspec-base-pg12
    - .rspec-base-migration
    - .rails:rules:rspec-on-pg12
    - .rspec-migration-parallel

rspec background_migration pg12:
  extends:
    - .rspec-base-pg12
    - .rspec-base-migration
    - .rails:rules:rspec-on-pg12
    - .rspec-background-migration-parallel

rspec unit pg12:
  extends:
    - .rspec-base-pg12
    - .rails:rules:rspec-on-pg12
    - .rspec-unit-parallel

rspec integration pg12:
  extends:
    - .rspec-base-pg12
    - .rails:rules:rspec-on-pg12
    - .rspec-integration-parallel

rspec system pg12:
  extends:
    - .rspec-base-pg12
    - .rails:rules:rspec-on-pg12
    - .rspec-system-parallel

# PG13
rspec migration pg13:
  extends:
    - .rspec-base-pg13
    - .rspec-base-migration
    - .rails:rules:default-branch-schedule-nightly--code-backstage
    - .rspec-migration-parallel

rspec background_migration pg13:
  extends:
    - .rspec-base-pg13
    - .rspec-base-migration
    - .rails:rules:default-branch-schedule-nightly--code-backstage
    - .rspec-background-migration-parallel

rspec unit pg13:
  extends:
    - .rspec-base-pg13
    - .rails:rules:default-branch-schedule-nightly--code-backstage
    - .rspec-unit-parallel

rspec integration pg13:
  extends:
    - .rspec-base-pg13
    - .rails:rules:default-branch-schedule-nightly--code-backstage
    - .rspec-integration-parallel

rspec system pg13:
  extends:
    - .rspec-base-pg13
    - .rails:rules:default-branch-schedule-nightly--code-backstage
    - .rspec-system-parallel

# PG15
rspec migration pg15:
  extends:
    - .rspec-base-pg15
    - .rspec-base-migration
    - .rails:rules:default-branch-schedule-nightly--code-backstage
    - .rspec-migration-parallel

rspec background_migration pg15:
  extends:
    - .rspec-base-pg15
    - .rspec-base-migration
    - .rails:rules:default-branch-schedule-nightly--code-backstage
    - .rspec-background-migration-parallel

rspec unit pg15:
  extends:
    - .rspec-base-pg15
    - .rails:rules:default-branch-schedule-nightly--code-backstage
    - .rspec-unit-parallel

rspec integration pg15:
  extends:
    - .rspec-base-pg15
    - .rails:rules:default-branch-schedule-nightly--code-backstage
    - .rspec-integration-parallel

rspec system pg15:
  extends:
    - .rspec-base-pg15
    - .rails:rules:default-branch-schedule-nightly--code-backstage
    - .rspec-system-parallel
# EE/FOSS: default branch nightly scheduled jobs #
##########################################

#####################################
# EE: default branch nightly scheduled jobs #

# PG12
rspec-ee migration pg12:
  extends:
    - .rspec-ee-base-pg12
    - .rspec-base-migration
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
    - .rspec-ee-migration-parallel

rspec-ee background_migration pg12:
  extends:
    - .rspec-ee-base-pg12
    - .rspec-base-migration
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
    - .rspec-ee-background-migration-parallel

rspec-ee unit pg12:
  extends:
    - .rspec-ee-base-pg12
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
    - .rspec-ee-unit-parallel

rspec-ee integration pg12:
  extends:
    - .rspec-ee-base-pg12
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
    - .rspec-ee-integration-parallel

rspec-ee system pg12:
  extends:
    - .rspec-ee-base-pg12
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
    - .rspec-ee-system-parallel

# PG13
rspec-ee unit pg13 opensearch1:
  extends:
    - .rspec-ee-base-pg13-opensearch1
    - .rspec-ee-unit-parallel

rspec-ee unit pg13 opensearch2:
  extends:
    - .rspec-ee-base-pg13-opensearch2
    - .rspec-ee-unit-parallel

rspec-ee integration pg13 opensearch1:
  extends:
    - .rspec-ee-base-pg13-opensearch1
    - .rspec-ee-integration-parallel

rspec-ee integration pg13 opensearch2:
  extends:
    - .rspec-ee-base-pg13-opensearch2
    - .rspec-ee-integration-parallel

rspec-ee system pg13 opensearch1:
  extends:
    - .rspec-ee-base-pg13-opensearch1
    - .rspec-ee-system-parallel

rspec-ee system pg13 opensearch2:
  extends:
    - .rspec-ee-base-pg13-opensearch2
    - .rspec-ee-system-parallel

# PG14
rspec-ee unit pg14 opensearch1:
  extends:
    - .rspec-ee-base-pg14-opensearch1
    - .rspec-ee-unit-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

rspec-ee unit pg14 opensearch2:
  extends:
    - .rspec-ee-base-pg14-opensearch2
    - .rspec-ee-unit-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

rspec-ee integration pg14 opensearch1:
  extends:
    - .rspec-ee-base-pg14-opensearch1
    - .rspec-ee-integration-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

rspec-ee integration pg14 opensearch2:
  extends:
    - .rspec-ee-base-pg14-opensearch2
    - .rspec-ee-integration-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

rspec-ee system pg14 opensearch1:
  extends:
    - .rspec-ee-base-pg14-opensearch1
    - .rspec-ee-system-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

rspec-ee system pg14 opensearch2:
  extends:
    - .rspec-ee-base-pg14-opensearch2
    - .rspec-ee-system-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

# PG15
rspec-ee unit pg15 opensearch1:
  extends:
    - .rspec-ee-base-pg15-opensearch1
    - .rspec-ee-unit-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

rspec-ee unit pg15 opensearch2:
  extends:
    - .rspec-ee-base-pg15-opensearch2
    - .rspec-ee-unit-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

rspec-ee integration pg15 opensearch1:
  extends:
    - .rspec-ee-base-pg15-opensearch1
    - .rspec-ee-integration-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

rspec-ee integration pg15 opensearch2:
  extends:
    - .rspec-ee-base-pg15-opensearch2
    - .rspec-ee-integration-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

rspec-ee system pg15 opensearch1:
  extends:
    - .rspec-ee-base-pg15-opensearch1
    - .rspec-ee-system-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

rspec-ee system pg15 opensearch2:
  extends:
    - .rspec-ee-base-pg15-opensearch2
    - .rspec-ee-system-parallel
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only

rspec-ee migration pg15:
  extends:
    - .rspec-ee-base-pg15
    - .rspec-base-migration
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
    - .rspec-ee-migration-parallel

rspec-ee background_migration pg15:
  extends:
    - .rspec-ee-base-pg15
    - .rspec-base-migration
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
    - .rspec-ee-background-migration-parallel

rspec-ee unit pg15:
  extends:
    - .rspec-ee-base-pg15
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
    - .rspec-ee-unit-parallel

rspec-ee unit pg15 es8:
  extends:
    - .rspec-ee-base-pg15-es8
    - .rspec-ee-unit-parallel

rspec-ee integration pg15:
  extends:
    - .rspec-ee-base-pg15
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
    - .rspec-ee-integration-parallel

rspec-ee integration pg15 es8:
  extends:
    - .rspec-ee-base-pg15-es8
    - .rspec-ee-integration-parallel

rspec-ee system pg15:
  extends:
    - .rspec-ee-base-pg15
    - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
    - .rspec-ee-system-parallel

rspec-ee system pg15 es8:
  extends:
    - .rspec-ee-base-pg15-es8
    - .rspec-ee-system-parallel
# EE: default branch nightly scheduled jobs #
#####################################

##################################################
# EE: Canonical MR pipelines
.rspec-fail-fast:
  extends:
    - .rails:rules:rspec fail-fast
  stage: test
  needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets", "detect-tests"]
  script:
    - !reference [.base-script, script]
    - rspec_fail_fast "${MATCHING_TESTS_PATH}" "--fail-fast=${RSPEC_FAIL_FAST_THRESHOLD} --tag ~quarantine --tag ~zoekt --tag ~click_house"

rspec fail-fast:
  extends:
    - .rspec-base-pg14
    - .rspec-fail-fast  # extends from .rspec-fail-fast last to override script from .rspec-base-pg14
  variables:
    MATCHING_TESTS_PATH: "${RSPEC_MATCHING_TESTS_FOSS_PATH}"

rspec-ee fail-fast:
  extends:
    - .rspec-ee-base-pg14
    - .rspec-fail-fast  # extends from .rspec-fail-fast last to override script from .rspec-ee-base-pg13
  variables:
    MATCHING_TESTS_PATH: "${RSPEC_MATCHING_TESTS_EE_PATH}"

rspec-foss-impact:pipeline-generate:
  extends:
    - .rails:rules:rspec-foss-impact
  stage: prepare
  needs: ["detect-tests", "retrieve-tests-metadata"]
  script:
    - scripts/generate_rspec_pipeline.rb -f "${RSPEC_MATCHING_TESTS_FOSS_PATH}" -t "${RSPEC_FOSS_IMPACT_PIPELINE_TEMPLATE_YML}" -k "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}"
    - cat "${RSPEC_FOSS_IMPACT_PIPELINE_TEMPLATE_YML}.yml"
  artifacts:
    expire_in: 1 day
    paths:
      - "${RSPEC_FOSS_IMPACT_PIPELINE_TEMPLATE_YML}.yml"

rspec-foss-impact:trigger:
  extends:
    - .rails:rules:rspec-foss-impact
  stage: test
  needs:
    - job: "setup-test-env"
      artifacts: false
    - job: "retrieve-tests-metadata"
      artifacts: false
    - job: "compile-test-assets as-if-foss"
      artifacts: false
    - job: "rspec-foss-impact:pipeline-generate"
      artifacts: true
  variables:
    PARENT_PIPELINE_ID: $CI_PIPELINE_ID
  trigger:
    strategy: depend
    forward:
      yaml_variables: true
      pipeline_variables: true
    include:
      - artifact: "${RSPEC_FOSS_IMPACT_PIPELINE_TEMPLATE_YML}.yml"
        job: rspec-foss-impact:pipeline-generate

fail-pipeline-early:
  extends:
    - .rails:rules:fail-pipeline-early
  stage: post-test
  needs:
    - job: rspec fail-fast
      artifacts: false
  variables:
    GIT_DEPTH: 1
  before_script:
    - source scripts/utils.sh
    - install_gitlab_gem
  script:
    - fail_pipeline_early

.base-rspec-pg14-rerun-previous-failed-tests:
  extends:
    - .rails:rules:rerun-previous-failed-tests
  stage: test
  needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets", "detect-previous-failed-tests"]
  script:
    - !reference [.base-script, script]
    - rspec_rerun_previous_failed_tests "${PREVIOUS_FAILED_TESTS_FILE}"

rspec rspec-pg14-rerun-previous-failed-tests:
  extends:
    - .rspec-base-pg14
    - .base-rspec-pg14-rerun-previous-failed-tests
  variables:
    PREVIOUS_FAILED_TESTS_FILE: tmp/previous_failed_tests/rspec_failed_tests.txt

rspec rspec-ee-pg14-rerun-previous-failed-tests:
  extends:
    - .rspec-ee-base-pg14
    - .base-rspec-pg14-rerun-previous-failed-tests
  variables:
    PREVIOUS_FAILED_TESTS_FILE: tmp/previous_failed_tests/rspec_ee_failed_files.txt
# EE: Canonical MR pipelines
##################################################
